<script>
    // 装饰者模式
    //  不改变原来的类，并且不使用继承，把一个类的进行增强

    // 案例：
    //     比如现在有一个学生类，他有一个方法学习，
    //     学习内容是html，css，js
    //     码路就是这个学生的实例

    function Student() { }
    Student.prototype.study = function () {
        console.log("html")
        console.log("css")
        console.log("js")
    };

    // 定义一个装饰类,对Student类进行增强
    function ZhuangShi(sombody){
        this.sombody = sombody
        this.sombody.xixi = "xixi~"
        return this.sombody; 
    }
    var malu = new Student();
    malu = new ZhuangShi(malu);
    console.log(malu.xixi);
    console.log(malu instanceof Student);
    console.log(malu instanceof ZhuangShi);
</script>





<script>
    // 如果我们想给当前的malu的实例装饰一些其他的内容，
    // 不仅仅是增加属性，而是增加功能，
    // 比如码路本身有study功能，此时我们想增强这个study功能
    function Student() {}
    Student.prototype.study = function () {
        console.log("html")
        console.log("css")
        console.log("js")
    };
    // 定义一个装饰类,对Student类进行增强
    function ZhuangShi(sombody) {
        this.sombody = sombody;
        // 把之前的study方法备份一下
        this.sombody._study = sombody.study;
        // 把ZhuangShi构造器生成的对象中的study，覆盖掉之前的study方法
        this.sombody.study = this.study;
        return this.sombody;
    }
    ZhuangShi.prototype.study = function () {
        // 调用原本的study方法
        this._study();
        console.log("vue");
        console.log("react");
    }
    let malu = new Student();

    malu = new ZhuangShi(malu)
    malu.study();
</script>